Skip to content
本页目录

插入排序

基本思想:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。

算法过程描述:

  1. 从第一个元素开始,可认为该元素已被排序;
  2. 取出下一个元素(记为当前元素),在已排序的元素序列中从后向前扫描;
  3. 若被扫描到的已排序元素大于当前元素,则将该已排序元素移到下一位置;
  4. 重复步骤3,直到找到已排序元素小于等于当前元素的位置;
  5. 将当前元素插入到该位置
  6. 重复步骤2步骤5,直到完成排序。

移位法

JavaScript
const insertionSort = A => {
  for (let i = 1; i < A.length; i++) {
    // i-1 为已排序元素的末位
    let [j, cur] = [i - 1, A[i]] // 向后移位时会被覆盖,先缓存
    while (j >= 0 && A[j] > cur) {
      A[j + 1] = A[j]
      j--
    }
    A[j + 1] = cur // 该位置后插入
  }
}

稳定性:

若将 第5行 代码中的>改为>=,该算法将不再是稳定排序算法!

交换法

JavaScript
const insertionSort = A => {
  for (let i = 1; i < A.length; i++) {
    let j = i - 1
    while (j >= 0 && A[j] > A[i]) { // 一直交换,直到找到合适的位置
      [A[j], A[i]] = [A[i], A[j]]
      j--
    }
  }
}

稳定性:

若将 第4行 代码中的>改为>=,该算法将不再是稳定排序算法!